using System;
using System.Collections.Generic;
using System.Text;
using DTO;
using System.Data;
using System.Data.SqlClient;

namespace DAO
{
	/// <summary> 
	///Author: nnamthach@gmail.com 
	/// <summary>
    public class OpNgayDataAccess : Connection
    {
		#region Local Variable
        public OpNgayDataAccess(string type, string connectString, int timeout = 0) : base(type, connectString, timeout) { }
        public OpNgayDataAccess(Connection connection) : base(connection) { }
		#endregion Local Variable
		
		#region Method        
		public DataTable GetShortData(String XuongId, List<DTO.FilterParameter> filters, ref string sErr) {
            string sql = @"SELECT LineId  
            FROM  OpNgay
            WHERE  XuongId = @XuongId";
			
			bool hasfilters = BeginFilterParameter(ref sql, filters);

            InitConnect();
            InitCommand(sql);
            AddParameter(OpNgayInfo.Field.XuongId, XuongId);
            if (hasfilters) AddFilterParameter(filters);
			
            DataTable list = new DataTable();
            try { list = executeSelect(); }
            catch (Exception ex) { sErr = string.Format("{0} sql='{1}'", ex.Message, sql); }

            return list;
        }
		
		public DataTable GetByFilterToDataTable(String XuongId, List<DTO.FilterParameter> filters, ref string sErr, int indexPage = 0, int itemPerPage = 0) {            
            string sql = @"SELECT  XuongId, LineId, Ngay1, Ngay2, Ngay3, Ngay4, Ngay5, Ngay6, Ngay7, Ngay8, Ngay9, Ngay10, Ngay11, Ngay12, Ngay13, Ngay14, Ngay15, Ngay16, Ngay17, Ngay18, Ngay19, Ngay20, Ngay21, Ngay22, Ngay23, Ngay24, Ngay25, Ngay26, Ngay27, Ngay28, Ngay29, Ngay30, Ngay31
            FROM  OpNgay
            WHERE  XuongId = @XuongId";

            bool hasfilters = BeginFilterParameter(ref sql, filters);
			
			sql += @" ORDER BY  XuongId, LineId";
			
            if (itemPerPage != 0) {
                if (DbType == "S") sql += @" OFFSET @indexPage ROWS FETCH NEXT @itemPerPage ROWS ONLY";
                else sql += @" LIMIT @indexPage ,@itemPerPage ";
            }
            
            InitConnect();
            InitCommand(sql);
            AddParameter(OpNgayInfo.Field.XuongId, XuongId);
            if (itemPerPage != 0) {
                AddParameter("indexPage", indexPage);
                AddParameter("itemPerPage", itemPerPage);
            }

			if (hasfilters) AddFilterParameter(filters);
			
            DataTable list = new DataTable();
            try { list = executeSelect(); }
			catch (Exception ex) { sErr = string.Format("{0} sql='{1}'", ex.Message, sql); }

            return list;
        }
		
		
		public OpNgayInfo[] GetByFilter(String XuongId, List<DTO.FilterParameter> filters, ref string sErr, int indexPage = 0, int itemPerPage = 0) {
			DataTable list = GetByFilterToDataTable(XuongId, filters, ref sErr, indexPage, itemPerPage);

			if (sErr != "") return null;
			
            OpNgayInfo[] res = null;            
			
			try
			{
				res = new OpNgayInfo[list.Rows.Count];
				for (int i = 0; i < list.Rows.Count; i++)
					res[i] = new OpNgayInfo(list.Rows[i]);
			}
			catch (Exception ex) { sErr = ex.Message; }
            
			if (sErr != "") return null;
            return res;
        }
		
		public int GetCountRecord(String XuongId, List<DTO.FilterParameter> filters, ref string sErr) {
            string sql = @"SELECT COUNT(*)
                FROM  OpNgay
                WHERE  XuongId = @XuongId";
				
			bool hasfilters = BeginFilterParameter(ref sql, filters);
			
			int ret = -1;
            openConnection();
            InitCommand(sql);
            AddParameter(OpNgayInfo.Field.XuongId, XuongId);
          
			if (hasfilters) AddFilterParameter(filters);
		  
            try
            {
                object tmp = executeScalar();

                if(tmp != null && tmp != DBNull.Value) ret = Convert.ToInt32(tmp);
				else ret = 0;
            }
            catch (Exception ex) { sErr = string.Format("{0} sql='{1}'", ex.Message, sql); }
            finally { closeConnection(); }
			
            return ret;			
        }
		
		/// <summary>
        /// Return 1: Table is exist Identity Field
        /// Return 0: Table is not exist Identity Field
        /// Return -1: Erro
        /// </summary>
        /// <param name="tableName"></param>
        public int Add(OpNgayInfo objEntr, ref string sErr) {
            string sqlFields = @" INSERT INTO OpNgay(XuongId,LineId,";
            string sqlValues = @" VALUES(@XuongId,@LineId,";

            if (objEntr.Ngay1 != null) { sqlFields += " Ngay1,"; sqlValues += " @Ngay1,"; }
            if (objEntr.Ngay2 != null) { sqlFields += " Ngay2,"; sqlValues += " @Ngay2,"; }
            if (objEntr.Ngay3 != null) { sqlFields += " Ngay3,"; sqlValues += " @Ngay3,"; }
            if (objEntr.Ngay4 != null) { sqlFields += " Ngay4,"; sqlValues += " @Ngay4,"; }
            if (objEntr.Ngay5 != null) { sqlFields += " Ngay5,"; sqlValues += " @Ngay5,"; }
            if (objEntr.Ngay6 != null) { sqlFields += " Ngay6,"; sqlValues += " @Ngay6,"; }
            if (objEntr.Ngay7 != null) { sqlFields += " Ngay7,"; sqlValues += " @Ngay7,"; }
            if (objEntr.Ngay8 != null) { sqlFields += " Ngay8,"; sqlValues += " @Ngay8,"; }
            if (objEntr.Ngay9 != null) { sqlFields += " Ngay9,"; sqlValues += " @Ngay9,"; }
            if (objEntr.Ngay10 != null) { sqlFields += " Ngay10,"; sqlValues += " @Ngay10,"; }
            if (objEntr.Ngay11 != null) { sqlFields += " Ngay11,"; sqlValues += " @Ngay11,"; }
            if (objEntr.Ngay12 != null) { sqlFields += " Ngay12,"; sqlValues += " @Ngay12,"; }
            if (objEntr.Ngay13 != null) { sqlFields += " Ngay13,"; sqlValues += " @Ngay13,"; }
            if (objEntr.Ngay14 != null) { sqlFields += " Ngay14,"; sqlValues += " @Ngay14,"; }
            if (objEntr.Ngay15 != null) { sqlFields += " Ngay15,"; sqlValues += " @Ngay15,"; }
            if (objEntr.Ngay16 != null) { sqlFields += " Ngay16,"; sqlValues += " @Ngay16,"; }
            if (objEntr.Ngay17 != null) { sqlFields += " Ngay17,"; sqlValues += " @Ngay17,"; }
            if (objEntr.Ngay18 != null) { sqlFields += " Ngay18,"; sqlValues += " @Ngay18,"; }
            if (objEntr.Ngay19 != null) { sqlFields += " Ngay19,"; sqlValues += " @Ngay19,"; }
            if (objEntr.Ngay20 != null) { sqlFields += " Ngay20,"; sqlValues += " @Ngay20,"; }
            if (objEntr.Ngay21 != null) { sqlFields += " Ngay21,"; sqlValues += " @Ngay21,"; }
            if (objEntr.Ngay22 != null) { sqlFields += " Ngay22,"; sqlValues += " @Ngay22,"; }
            if (objEntr.Ngay23 != null) { sqlFields += " Ngay23,"; sqlValues += " @Ngay23,"; }
            if (objEntr.Ngay24 != null) { sqlFields += " Ngay24,"; sqlValues += " @Ngay24,"; }
            if (objEntr.Ngay25 != null) { sqlFields += " Ngay25,"; sqlValues += " @Ngay25,"; }
            if (objEntr.Ngay26 != null) { sqlFields += " Ngay26,"; sqlValues += " @Ngay26,"; }
            if (objEntr.Ngay27 != null) { sqlFields += " Ngay27,"; sqlValues += " @Ngay27,"; }
            if (objEntr.Ngay28 != null) { sqlFields += " Ngay28,"; sqlValues += " @Ngay28,"; }
            if (objEntr.Ngay29 != null) { sqlFields += " Ngay29,"; sqlValues += " @Ngay29,"; }
            if (objEntr.Ngay30 != null) { sqlFields += " Ngay30,"; sqlValues += " @Ngay30,"; }
            if (objEntr.Ngay31 != null) { sqlFields += " Ngay31,"; sqlValues += " @Ngay31,"; }
/* Can not combine this 			if (objEntr.<%CreateColumn(Name)%> != null) { sqlFields += " <%CreateColumn(FieldName)%>,"; sqlValues += " @<%CreateColumn(FieldName)%>,"; }*/
/* Can not combine this 			if (objEntr.<%UpdateColumn(Name)%> != null) { sqlFields += " <%UpdateColumn(FieldName)%>,"; sqlValues += " @<%UpdateColumn(FieldName)%>,"; }*/

            sqlFields = sqlFields.Substring(0, sqlFields.Length - 1) + ")";
            sqlValues = sqlValues.Substring(0, sqlValues.Length - 1) + ")";

            int ret = -1;
			string sql = sqlFields + sqlValues;
            openConnection();
            InitCommand(sql);
            AddParameter(OpNgayInfo.Field.XuongId, objEntr.XuongId);
            AddParameter(OpNgayInfo.Field.LineId, objEntr.LineId);

            if (objEntr.Ngay1 != null) AddParameter(OpNgayInfo.Field.Ngay1, objEntr.Ngay1);         
            if (objEntr.Ngay2 != null) AddParameter(OpNgayInfo.Field.Ngay2, objEntr.Ngay2);         
            if (objEntr.Ngay3 != null) AddParameter(OpNgayInfo.Field.Ngay3, objEntr.Ngay3);         
            if (objEntr.Ngay4 != null) AddParameter(OpNgayInfo.Field.Ngay4, objEntr.Ngay4);         
            if (objEntr.Ngay5 != null) AddParameter(OpNgayInfo.Field.Ngay5, objEntr.Ngay5);         
            if (objEntr.Ngay6 != null) AddParameter(OpNgayInfo.Field.Ngay6, objEntr.Ngay6);         
            if (objEntr.Ngay7 != null) AddParameter(OpNgayInfo.Field.Ngay7, objEntr.Ngay7);         
            if (objEntr.Ngay8 != null) AddParameter(OpNgayInfo.Field.Ngay8, objEntr.Ngay8);         
            if (objEntr.Ngay9 != null) AddParameter(OpNgayInfo.Field.Ngay9, objEntr.Ngay9);         
            if (objEntr.Ngay10 != null) AddParameter(OpNgayInfo.Field.Ngay10, objEntr.Ngay10);         
            if (objEntr.Ngay11 != null) AddParameter(OpNgayInfo.Field.Ngay11, objEntr.Ngay11);         
            if (objEntr.Ngay12 != null) AddParameter(OpNgayInfo.Field.Ngay12, objEntr.Ngay12);         
            if (objEntr.Ngay13 != null) AddParameter(OpNgayInfo.Field.Ngay13, objEntr.Ngay13);         
            if (objEntr.Ngay14 != null) AddParameter(OpNgayInfo.Field.Ngay14, objEntr.Ngay14);         
            if (objEntr.Ngay15 != null) AddParameter(OpNgayInfo.Field.Ngay15, objEntr.Ngay15);         
            if (objEntr.Ngay16 != null) AddParameter(OpNgayInfo.Field.Ngay16, objEntr.Ngay16);         
            if (objEntr.Ngay17 != null) AddParameter(OpNgayInfo.Field.Ngay17, objEntr.Ngay17);         
            if (objEntr.Ngay18 != null) AddParameter(OpNgayInfo.Field.Ngay18, objEntr.Ngay18);         
            if (objEntr.Ngay19 != null) AddParameter(OpNgayInfo.Field.Ngay19, objEntr.Ngay19);         
            if (objEntr.Ngay20 != null) AddParameter(OpNgayInfo.Field.Ngay20, objEntr.Ngay20);         
            if (objEntr.Ngay21 != null) AddParameter(OpNgayInfo.Field.Ngay21, objEntr.Ngay21);         
            if (objEntr.Ngay22 != null) AddParameter(OpNgayInfo.Field.Ngay22, objEntr.Ngay22);         
            if (objEntr.Ngay23 != null) AddParameter(OpNgayInfo.Field.Ngay23, objEntr.Ngay23);         
            if (objEntr.Ngay24 != null) AddParameter(OpNgayInfo.Field.Ngay24, objEntr.Ngay24);         
            if (objEntr.Ngay25 != null) AddParameter(OpNgayInfo.Field.Ngay25, objEntr.Ngay25);         
            if (objEntr.Ngay26 != null) AddParameter(OpNgayInfo.Field.Ngay26, objEntr.Ngay26);         
            if (objEntr.Ngay27 != null) AddParameter(OpNgayInfo.Field.Ngay27, objEntr.Ngay27);         
            if (objEntr.Ngay28 != null) AddParameter(OpNgayInfo.Field.Ngay28, objEntr.Ngay28);         
            if (objEntr.Ngay29 != null) AddParameter(OpNgayInfo.Field.Ngay29, objEntr.Ngay29);         
            if (objEntr.Ngay30 != null) AddParameter(OpNgayInfo.Field.Ngay30, objEntr.Ngay30);         
            if (objEntr.Ngay31 != null) AddParameter(OpNgayInfo.Field.Ngay31, objEntr.Ngay31);         
/* Can not combine this 			if (objEntr.<%CreateColumn(Name)%> != null) AddParameter(OpNgayInfo.Field.<%CreateColumn(Name)%>, objEntr.<%CreateColumn(Name)%>);*/
/* Can not combine this 			if (objEntr.<%UpdateColumn(Name)%> != null) AddParameter(OpNgayInfo.Field.<%UpdateColumn(Name)%>, objEntr.<%UpdateColumn(Name)%>);*/
          
            try
            {
                object tmp = executeScalar();
                if(tmp != null && tmp != DBNull.Value) ret = Convert.ToInt32(tmp);
				else ret = 0;
            }
            catch (Exception ex) { sErr = string.Format("{0} sql='{1}'", ex.Message, sql); }
            finally { closeConnection(); }

            return ret;
        }

        public string Update(OpNgayInfo objEntr) {
            string sql = @"UPDATE OpNgay SET ";
			
            if (objEntr.Ngay1 != null) { sql += "Ngay1 = @Ngay1,"; }
            if (objEntr.Ngay2 != null) { sql += "Ngay2 = @Ngay2,"; }
            if (objEntr.Ngay3 != null) { sql += "Ngay3 = @Ngay3,"; }
            if (objEntr.Ngay4 != null) { sql += "Ngay4 = @Ngay4,"; }
            if (objEntr.Ngay5 != null) { sql += "Ngay5 = @Ngay5,"; }
            if (objEntr.Ngay6 != null) { sql += "Ngay6 = @Ngay6,"; }
            if (objEntr.Ngay7 != null) { sql += "Ngay7 = @Ngay7,"; }
            if (objEntr.Ngay8 != null) { sql += "Ngay8 = @Ngay8,"; }
            if (objEntr.Ngay9 != null) { sql += "Ngay9 = @Ngay9,"; }
            if (objEntr.Ngay10 != null) { sql += "Ngay10 = @Ngay10,"; }
            if (objEntr.Ngay11 != null) { sql += "Ngay11 = @Ngay11,"; }
            if (objEntr.Ngay12 != null) { sql += "Ngay12 = @Ngay12,"; }
            if (objEntr.Ngay13 != null) { sql += "Ngay13 = @Ngay13,"; }
            if (objEntr.Ngay14 != null) { sql += "Ngay14 = @Ngay14,"; }
            if (objEntr.Ngay15 != null) { sql += "Ngay15 = @Ngay15,"; }
            if (objEntr.Ngay16 != null) { sql += "Ngay16 = @Ngay16,"; }
            if (objEntr.Ngay17 != null) { sql += "Ngay17 = @Ngay17,"; }
            if (objEntr.Ngay18 != null) { sql += "Ngay18 = @Ngay18,"; }
            if (objEntr.Ngay19 != null) { sql += "Ngay19 = @Ngay19,"; }
            if (objEntr.Ngay20 != null) { sql += "Ngay20 = @Ngay20,"; }
            if (objEntr.Ngay21 != null) { sql += "Ngay21 = @Ngay21,"; }
            if (objEntr.Ngay22 != null) { sql += "Ngay22 = @Ngay22,"; }
            if (objEntr.Ngay23 != null) { sql += "Ngay23 = @Ngay23,"; }
            if (objEntr.Ngay24 != null) { sql += "Ngay24 = @Ngay24,"; }
            if (objEntr.Ngay25 != null) { sql += "Ngay25 = @Ngay25,"; }
            if (objEntr.Ngay26 != null) { sql += "Ngay26 = @Ngay26,"; }
            if (objEntr.Ngay27 != null) { sql += "Ngay27 = @Ngay27,"; }
            if (objEntr.Ngay28 != null) { sql += "Ngay28 = @Ngay28,"; }
            if (objEntr.Ngay29 != null) { sql += "Ngay29 = @Ngay29,"; }
            if (objEntr.Ngay30 != null) { sql += "Ngay30 = @Ngay30,"; }
            if (objEntr.Ngay31 != null) { sql += "Ngay31 = @Ngay31,"; }
/* Can not combine this 			if (objEntr.<%UpdateColumn(Name)%> != null) { sql += "<%UpdateColumn(FieldName)%> = @<%UpdateColumn(FieldName)%>,"; }*/

			sql += " lastupdate = getdate()";
            sql += @" WHERE  XuongId = @XuongId AND LineId = @LineId";

            openConnection();
            InitCommand(sql);

            AddParameter(OpNgayInfo.Field.XuongId, objEntr.XuongId);
            AddParameter(OpNgayInfo.Field.LineId, objEntr.LineId);

            if (objEntr.Ngay1 != null) AddParameter(OpNgayInfo.Field.Ngay1, objEntr.Ngay1);         
            if (objEntr.Ngay2 != null) AddParameter(OpNgayInfo.Field.Ngay2, objEntr.Ngay2);         
            if (objEntr.Ngay3 != null) AddParameter(OpNgayInfo.Field.Ngay3, objEntr.Ngay3);         
            if (objEntr.Ngay4 != null) AddParameter(OpNgayInfo.Field.Ngay4, objEntr.Ngay4);         
            if (objEntr.Ngay5 != null) AddParameter(OpNgayInfo.Field.Ngay5, objEntr.Ngay5);         
            if (objEntr.Ngay6 != null) AddParameter(OpNgayInfo.Field.Ngay6, objEntr.Ngay6);         
            if (objEntr.Ngay7 != null) AddParameter(OpNgayInfo.Field.Ngay7, objEntr.Ngay7);         
            if (objEntr.Ngay8 != null) AddParameter(OpNgayInfo.Field.Ngay8, objEntr.Ngay8);         
            if (objEntr.Ngay9 != null) AddParameter(OpNgayInfo.Field.Ngay9, objEntr.Ngay9);         
            if (objEntr.Ngay10 != null) AddParameter(OpNgayInfo.Field.Ngay10, objEntr.Ngay10);         
            if (objEntr.Ngay11 != null) AddParameter(OpNgayInfo.Field.Ngay11, objEntr.Ngay11);         
            if (objEntr.Ngay12 != null) AddParameter(OpNgayInfo.Field.Ngay12, objEntr.Ngay12);         
            if (objEntr.Ngay13 != null) AddParameter(OpNgayInfo.Field.Ngay13, objEntr.Ngay13);         
            if (objEntr.Ngay14 != null) AddParameter(OpNgayInfo.Field.Ngay14, objEntr.Ngay14);         
            if (objEntr.Ngay15 != null) AddParameter(OpNgayInfo.Field.Ngay15, objEntr.Ngay15);         
            if (objEntr.Ngay16 != null) AddParameter(OpNgayInfo.Field.Ngay16, objEntr.Ngay16);         
            if (objEntr.Ngay17 != null) AddParameter(OpNgayInfo.Field.Ngay17, objEntr.Ngay17);         
            if (objEntr.Ngay18 != null) AddParameter(OpNgayInfo.Field.Ngay18, objEntr.Ngay18);         
            if (objEntr.Ngay19 != null) AddParameter(OpNgayInfo.Field.Ngay19, objEntr.Ngay19);         
            if (objEntr.Ngay20 != null) AddParameter(OpNgayInfo.Field.Ngay20, objEntr.Ngay20);         
            if (objEntr.Ngay21 != null) AddParameter(OpNgayInfo.Field.Ngay21, objEntr.Ngay21);         
            if (objEntr.Ngay22 != null) AddParameter(OpNgayInfo.Field.Ngay22, objEntr.Ngay22);         
            if (objEntr.Ngay23 != null) AddParameter(OpNgayInfo.Field.Ngay23, objEntr.Ngay23);         
            if (objEntr.Ngay24 != null) AddParameter(OpNgayInfo.Field.Ngay24, objEntr.Ngay24);         
            if (objEntr.Ngay25 != null) AddParameter(OpNgayInfo.Field.Ngay25, objEntr.Ngay25);         
            if (objEntr.Ngay26 != null) AddParameter(OpNgayInfo.Field.Ngay26, objEntr.Ngay26);         
            if (objEntr.Ngay27 != null) AddParameter(OpNgayInfo.Field.Ngay27, objEntr.Ngay27);         
            if (objEntr.Ngay28 != null) AddParameter(OpNgayInfo.Field.Ngay28, objEntr.Ngay28);         
            if (objEntr.Ngay29 != null) AddParameter(OpNgayInfo.Field.Ngay29, objEntr.Ngay29);         
            if (objEntr.Ngay30 != null) AddParameter(OpNgayInfo.Field.Ngay30, objEntr.Ngay30);         
            if (objEntr.Ngay31 != null) AddParameter(OpNgayInfo.Field.Ngay31, objEntr.Ngay31);         
/* Can not combine this 			if (objEntr.<%UpdateColumn(Name)%> != null) AddParameter(OpNgayInfo.Field.<%UpdateColumn(Name)%>, objEntr.<%UpdateColumn(Name)%>);          */
               
            string sErr = "";

            try { executeNonQuery(); }
            catch (Exception ex) { sErr = string.Format("{0} sql='{1}'", ex.Message, sql); }
            finally { closeConnection(); }

            return sErr;
        }

        public string Delete(String XuongId, Int32 LineId) {
            string sql = @"DELETE OpNgay
            WHERE 	 XuongId = @XuongId AND LineId = @LineId";

            openConnection();
            InitCommand(sql);

            AddParameter(OpNgayInfo.Field.XuongId, XuongId);
            AddParameter(OpNgayInfo.Field.LineId, LineId);
              
            string sErr = "";
            try { executeNonQuery(); }
            catch (Exception ex) { sErr = string.Format("{0} sql='{1}'", ex.Message, sql); }
            finally { closeConnection(); }

            return sErr;
        }   	
        
        public Boolean IsExist(String XuongId, Int32? LineId, ref string sErr) {
            string sql = @"SELECT TOP (1) XuongId, LineId
            FROM  OpNgay
            WHERE 	 XuongId = @XuongId AND LineId = @LineId";
			
            InitConnect();
            InitCommand(sql);
            AddParameter(OpNgayInfo.Field.XuongId, XuongId);              
            AddParameter(OpNgayInfo.Field.LineId, LineId);              
            
            DataTable list = new DataTable();
            try { list = executeSelect(); }
            catch (Exception ex) { sErr = ex.Message + " sql='" + sql + "'"; }

			return list.Rows.Count == 1;
        }		
		
		#endregion Method
     
    }
}
